package ATM;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.Random;

public class ATM {
    private ArrayList<Account> accounts = new ArrayList<>();
    private Scanner sc = new Scanner(System.in);
    private Account loginAcc = new Account(); // 用来记住登录后的用户账户

    /** 启动ATM系统，展示欢迎页面*/
    public void start(){
        while(true){
            System.out.println("*****欢迎进入ATM系统*****");
            System.out.println("1.用户登录");
            System.out.println("2.用户开户");
            System.out.println("0.退出系统");
            System.out.println("请选择：");

            int command = sc.nextInt();

            switch(command){
                case 1:
                    login();
                    // 用户登录
                    break;
                case 2:
                    // 用户开户
                    createAccount();
                    break;
                case 0:
                    System.out.println("正在退出系统……");
                    return;
                default:
                    System.out.println("没有该操作");
                    break;

            }
        }
    }

    /** 完成用户开户操作*/
    private void createAccount(){
        System.out.println("*****系统开户操作*****");
        // 创建一个账户对象，用来封装用户信息
        Account acc = new Account();
        // 输入自己的开户信息，复制给账户对象
        System.out.println("请输入用户名：");
        String userName = sc.next();
        acc.setUserName(userName);

        while(true){
            System.out.println("请输入性别(1为男/2为女）：");
            char sex = sc.next().charAt(0);
            if (sex == '1' || sex == '2'){
                acc.setSex(sex);
                break;
            }
            else{
                System.out.println("您输入的性别有误，请重新输入");
            }
        }

        while(true){
            System.out.println("请输入密码：");
            String password1 = sc.next();
            System.out.println("请确认密码：");
            String password2 = sc.next();
            if(password1.equals(password2)) {
                acc.setPassword(password1);
                break;
            }else{
                System.out.println("两次输入的密码不一致，请重试");
            }
        }

        System.out.println("请输入您的取现额度：");
        double limit = sc.nextDouble();
        acc.setLimit(limit);

        // 为账户生成一个卡号
        acc.setCardID(createCardID());

        // 把账户对象存入账户集合中
        accounts.add(acc);

        System.out.println("恭喜您，" + acc.getUserName() + "开户成功，您的卡号是：" + acc.getCardID());
    }

    /** 返回一个8位数字的卡号且不能和已有卡号重复*/
    private String createCardID(){
        String cardID = "";
        Random r = new Random();
        while(true){
            for(int i = 0;i < 8;i ++){
                int data = r.nextInt(0,10);
                cardID += data;
            }
            // 查询当前卡号是否与已有卡号重复：根据卡号查找账户，查找不到即未重复
            Account acc = getAccountByCardID(cardID);
            if(acc == null){
                return cardID;
            }
        }
    }

    /** 完成用户的登录操作 */
    private void login(){
        System.out.println("*****用户登录*****");
        if(accounts.size() == 0){
            System.out.println("当前系统中没有用户。");
            return;
        }

        while(true){
            System.out.println("请输入您的卡号：");
            String cardID = sc.next();
            Account acc = getAccountByCardID(cardID);
            if(acc == null){
                System.out.println("您输入的卡号不存在，请重试");
            }
            else{
                while(true){
                    System.out.println("请输入您的密码：");
                    String password = sc.next();
                    if(acc.getPassword().equals(password)){
                        loginAcc = acc;
                        System.out.println("恭喜您" + acc.getUserName() + "登录成功，您的卡号是：" + acc.getCardID());
                        showUserCommand();
                        return;
                    }else{
                        System.out.println("您输入的密码不正确，请重试");
                    }
                }
            }
        }
    }

    /** 根据卡号查询账户对象并返回*/
    private Account getAccountByCardID(String cardID){
        // 遍历全部的账户对象
        for(int i = 0;i < accounts.size();i++){
            Account acc = accounts.get(i);
            // 判断acc的卡号是不是要找的卡号
            if(acc.getCardID().equals(cardID)){
                return acc;
            }
        }
        return null;
    }

    /** 展示用户操作界面*/
    private void showUserCommand(){
        while(true){
            System.out.println("***************");
            System.out.println(loginAcc.getUserName() + "，请选择您要进行的操作");
            System.out.println("1.查询账户");
            System.out.println("2.存款");
            System.out.println("3.取款");
            System.out.println("4.转账");
            System.out.println("5.密码修改");
            System.out.println("6.退出登录");
            System.out.println("7.注销当前账户");
            System.out.println("请选择：");
            int command = sc.nextInt();
            switch(command) {
                case 1:
                    // 查询账户
                    showLoginAccount();
                    break;
                case 2:
                    // 存款
                    depositMoney();
                    break;
                case 3:
                    // 取款
                    drawMoney();
                    break;
                case 4:
                    // 转账
                    transferMoney();
                    break;
                case 5:
                    // 修改密码
                    updatePassword();
                    return;
                case 6:
                    // 退出登录
                    System.out.println("用户"+loginAcc.getUserName() + "正在退出登录……");
                    return; // 跳出并结束当前方法
                case 7:
                    // 注销当前账户
                    if(deleteAccount()){
                        // 销户成功，返回欢迎页面
                        return;
                    }
                    break;
                default:
                    System.out.println("不存在该操作。");
                    break;
            }
        }
    }

    /** 展示当前账户信息 */
    private void showLoginAccount(){
        System.out.println("*****用户信息*****");
        System.out.println("卡号：" + loginAcc.getCardID());
        System.out.println("用户名：" + loginAcc.getUserName());
        System.out.println("性别：" + loginAcc.getSex());
        System.out.println("余额：" + loginAcc.getMoney());
        System.out.println("取现额度：" + loginAcc.getLimit());
    }

    /** 用户存款功能 */
    private void depositMoney(){
        while(true){
            System.out.println("*****存钱操作*****");
            System.out.println("请输入您要存入的金额：");
            double money = sc.nextDouble();
            if(money<=0) {
                System.out.println("无法存入，请重新输入");
            }else{
                loginAcc.setMoney(loginAcc.getMoney()+money);
                System.out.println("恭喜您" + loginAcc.getUserName() + "存钱成功，当前余额为" + loginAcc.getMoney());
                break;
            }
        }

    }

    /** 用户取款功能 */
    private void drawMoney(){
        if(loginAcc.getMoney() < 100) {
            System.out.println("当前账户余额不足100元，不允许取钱");
        }
        while(true){
            System.out.println("*****取钱操作*****");
            System.out.println("请输入您要取出的金额：");
            double money = sc.nextDouble();
            if(money <= 0){
                System.out.println("无法取出，请重试");
            }else if(money > loginAcc.getLimit()){
                System.out.println("取款金额大于用户设置的限额：" + loginAcc.getLimit() + "，请重试");
            }else if(loginAcc.getMoney()<money){
                System.out.println("余额不足，您账户中的余额为" + loginAcc.getMoney());
            }else{
                loginAcc.setMoney(loginAcc.getMoney() - money);
                System.out.println("成功取款" + money + "元，当前余额为：" + loginAcc.getMoney());
                break;
            }
        }
    }

    /** 用户转账功能 */
    private void transferMoney(){
        System.out.println("*****转账操作*****");
        if(accounts.size() < 2){
            System.out.println("当前系统中账户数量不足两个，快去开户吧~~");
            return;
        }else if(loginAcc.getMoney() == 0){
            System.out.println("无法转账，当前账户中有" + loginAcc.getMoney() + "元");
            return;
        }
        while(true){
            System.out.println("请您输入对方的卡号：");
            Account acc = getAccountByCardID(sc.next());
            if(acc == null){
                System.out.println("你输入的对方的卡号不存在，请重试");
            }else{
                // 对方账户存在
                if(loginAcc.getCardID().equals(acc.getCardID())){
                    System.out.println("无法自己给自己转账，请重试");
                    return;
                }
                String name = '*' + acc.getUserName().substring(1);
                System.out.println("请您输入【" + name + "】的姓氏：");
                if(acc.getUserName().startsWith(sc.next())){
                    while(true){
                        System.out.println("请输入您要转账的金额：");
                        double money = sc.nextDouble();
                        if(money > loginAcc.getMoney()){
                            System.out.println("您的余额不足，当前余额为" + loginAcc.getMoney());
                        }else if(money <= 0){
                            System.out.println("无法转账，请重试");
                        }else{
                            loginAcc.setMoney(loginAcc.getMoney() - money);
                            acc.setMoney(acc.getMoney() + money);
                            System.out.println("转账成功，剩余余额为" + loginAcc.getMoney());
                            return;
                        }
                    }
                }else{
                    System.out.println("您输入的姓氏不正确，请重试");
                }
            }
        }
    }

    /** 用户注销账户 */
    private boolean deleteAccount(){
        System.out.println("是否确认销户？Y/N");
        String command = sc.next();
        switch(command){
            case "Y":
            case "y":
                // 判断用户的账户余额是否为0
                if(loginAcc.getMoney() == 0){
                    accounts.remove(loginAcc);
                    System.out.println("您的账户已成功注销");
                    return true;
                }else{
                    System.out.println("您的账户余额不为0，不允许销户");
                    return false;
                }
            default:
                System.out.println("好的，您的账户保留。");
                return false;
        }
    }

    /** 用户密码修改 */
    private void updatePassword(){
        while(true){
            System.out.println("请输入当前密码：");
            String password = sc.next();
            if(loginAcc.getPassword().equals(password)){
                while(true){
                    System.out.println("请输入新密码：");
                    String newPassword = sc.next();
                    System.out.println("请确认新密码：");
                    String okNewPassword = sc.next();
                    if(newPassword.equals(okNewPassword)){
                        loginAcc.setPassword(okNewPassword);
                        System.out.println("密码修改成功");
                        return;
                    }else{
                        System.out.println("两次输入的密码不一致");
                    }
                }
            }else{
                System.out.println("密码错误，请重试。");
            }

        }
    }
}
